<!DOCTYPE html>
<html lang="en">
<head>
        <meta charset="utf-8" />
        <title>chapter7</title>
        <link rel="stylesheet" href="/theme/css/main.css" />

        <!--[if IE]>
            <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
        <![endif]-->
</head>

<body id="index" class="home">
        <header id="banner" class="body">
                <h1><a href="/">PythonTutorials </a></h1>
                <nav><ul>
                    <li class="active"><a href="/category/cpp.html">cpp</a></li>
                    <li><a href="/category/python.html">python</a></li>
                </ul>
                </nav>
        </header><!-- /#banner -->
<section id="content" class="body">
  <article>
    <header>
      <h1 class="entry-title">
        <a href="/chapter7.html" rel="bookmark"
           title="Permalink to chapter7">chapter7</a></h1>
    </header>

    <div class="entry-content">
<footer class="post-info">
        <span>Mon 06 April 2020</span>
<span>| tags: <a href="/tag/cpp.html">cpp</a><a href="/tag/progarmming.html">progarmming</a></span>
</footer><!-- /.post-info -->      <h2>函数与预编译</h2>
<ol>
<li>函数的定义<ol>
<li>定义：函数返回值类型 函数名(形参列表){函数体;}（4+2）部分。</li>
<li>形参变量类型不能省（现代方法）</li>
<li>函数名遵循用户自定义标识符规则</li>
<li>一个main函数，为单框架</li>
<li>一个main函数+多个子函数，为复合框架</li>
<li>函数返回值类型：void类型（不可以加return），非void类型（一定要加return表达式）</li>
</ol>
</li>
<li>函数调用(函数类型)<ol>
<li>方式1：非void类型，变量名=函数名(实参列表)；</li>
<li>方式2：void类型，函数名(实参列表)；</li>
<li>注意事项：<ul>
<li>看框架（单、复）</li>
<li>子函数返回值类型（void or 非void类型）</li>
<li>主函数调用子函数的次数</li>
<li>执行过程（单向传值遵循三一致，参数个数相同，参数类型一致，参数位置次序一致）</li>
</ul>
</li>
</ol>
</li>
<li>注：<ul>
<li>一个源程序可以有一个或多个函数</li>
<li>一个c程序文件可以有一个或多个源程序文件组</li>
<li>一个C语言程序执行开始于main()，结束于main(),可调用其他函数</li>
<li>函数不能嵌套定义，但是可以相互调用，不能调用main（）</li>
</ul>
</li>
<li>
<p>函数的分类：</p>
<ul>
<li>️无参函数和有参函数</li>
<li>库函数和用户自定义函数+main()</li>
</ul>
</li>
<li>
<p>原型声明</p>
<ul>
<li>在main之前声明函数头部分</li>
<li>注：<ul>
<li>有头有体无分号；——函数定义</li>
<li>有头无体有分号；——原型声明</li>
<li>函数名（实参列表）；——函数调用（单向传值三一致）</li>
</ul>
</li>
</ul>
</li>
<li>
<p>变量的三属性</p>
<ul>
<li>类型（常量、变量、函数、表达式），先定义后使用</li>
<li>
<p>作用范围：变量的位置（局/外部变量和全/(外部)局变量），空间上</p>
<ul>
<li>
<p>局部变量：定义在一个函数内部的变量为局部变量</p>
<ul>
<li>局部变量只能在它所在的函数体内使用。</li>
<li>在不同的函数的中定义的变量，都只能在该函数内使用，属于局部变量</li>
<li>复合语句中的变量为局部变量</li>
<li>所有形式参数都是局部变量</li>
</ul>
</li>
<li>
<p>全局变量：在函数体外部定义的变量成为全局变量。</p>
</li>
<li>作用范围为从本文件开始到本文件结束的范围内。</li>
<li>全局变量可以本文件中都可以使用（引用，调用）。</li>
<li>在文件中若全部变量与局部变量同名，则局部变量会“屏蔽”全局变量。同名情况下，（局部变量优先级高于全局变量）<ul>
<li>存储类别：（auto、status、register、extern）时间上</li>
</ul>
</li>
<li>auto类别：<ul>
<li>变量用完后释放所占空间</li>
<li>局部变量默认为auto类别，无初始化时，auto变量的初始值为随机值</li>
<li>使用时间短，一般都为auto类别</li>
</ul>
</li>
<li>static类别（静态变量）：<ul>
<li>static类别从定义到程序运行结束都会占用内存空间，占用时间长</li>
<li>全局变量默认为static类别，无初始化时，初值为0</li>
<li>==static只能进行一次初始化。（画框保护，划掉之前的初始值）==</li>
</ul>
</li>
<li>
<p>register（寄存器类别）</p>
<ul>
<li>（）只有是局部变量才能别使用，一般不能直接被使用。时间周期非常短</li>
</ul>
</li>
<li>
<p>extern类别</p>
<ul>
<li>extern可以加大变量的使用范围</li>
<li>两种格式：<ul>
<li>格式1：定义的同时说明——存储类别 类型名 变量名；</li>
<li>格式2：分别定义和说明——类型名 变量名；存储类别 变量名；</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>
<p>预编译命令、宏（必须独占一行）</p>
<ol>
<li>预编译指令 <ul>
<li>预编译标志，#号   </li>
<li>文件包含（include）</li>
<li>
<h1>include &lt;&gt;，标准库中搜索</h1>
</li>
<li>
<h1>include "" ，双引号搜索范围扩大</h1>
</li>
</ul>
</li>
<li>宏<ul>
<li>无参数宏定义：<ul>
<li>格式：#define  宏名    宏内容</li>
<li>功能：用一个指定的标识符（宏名），，遵循用户自定义标识符来代表一串字符（宏内容）,一般大写</li>
<li>举例;# define PI 3.1415926   #define N 10</li>
<li>宏：符号常量、无语发检查、无类型</li>
<li>注意事项：（1）==#define可以在函数外定义也可以在函数内定义，但该命令应该为单独一行，#undef可以提前结束宏的作用域==（2）在进行宏定义是，可以引用已经定义的宏名，进行层层置换；</li>
<li>在==进行宏替换时，必须先原模原样替换完所有的宏后,再运算，同时替换过程中不能乱加符号。==</li>
</ul>
</li>
<li>带参数宏定义<ul>
<li>定义：#define 宏名（参数列表）宏内容</li>
<li>功能：提供了一种更加灵活的替代方式</li>
<li>举例：# define s(x,y) x*y+2</li>
<li>宏名后面的参数必须带括号</li>
<li>宏名和括号之间不可以有括号</li>
</ul>
</li>
</ul>
</li>
</ol>
</li>
</ol>
<h2>递归解题方法</h2>
<ol>
<li>辨认几条语句</li>
<li>画图</li>
<li>有去有回（最内层的返回值传递了倒数第二层，以此类推）</li>
</ol>
<div class="highlight"><pre><span></span>main(){
    int a=3,b=9;
    {
        int a=1,c=7;
        a=a+b;
        b=a+c;
        printf(&quot;a=%d,b=%d\n&quot;,a,b);
    }
    printf(&quot;a=%d,b=%d&quot;,a,b);
}
</pre></div>
    </div><!-- /.entry-content -->

  </article>
</section>
        <section id="extras" class="body">
                <div class="blogroll">
                        <h2>blogroll</h2>
                        <ul>
                            <li><a href="http://getpelican.com/">Pelican</a></li>
                            <li><a href="http://python.org/">Python.org</a></li>
                            <li><a href="http://jinja.pocoo.org/">Jinja2</a></li>
                            <li><a href="#">You can modify those links in your config file</a></li>
                        </ul>
                </div><!-- /.blogroll -->
                <div class="social">
                        <h2>social</h2>
                        <ul>

                            <li><a href="#">You can add links in your config file</a></li>
                            <li><a href="#">Another social link</a></li>
                        </ul>
                </div><!-- /.social -->
        </section><!-- /#extras -->

        <footer id="contentinfo" class="body">
                <p>Powered by <a href="http://www.maxiaoan.com/">Maxiaoan</a></p>
        </footer><!-- /#contentinfo -->

</body>
</html>